(function() {
    // 定义一个分数的变量
    let score = 0;

    function Game(map) {
        //创建food实例对象
        this.food = new Food({
            width: 20,
            height: 20,
            backgroundColor: Tools.getColor(),
            x: 0,
            y: 0,
        });
        //创建snake实例对象
        this.snake = new Snake({
            width: 20,
            height: 20,
        });
        // 地图实物
        this.map = map;
        //吃到食物的得分
        // this.score = 0;
        _this = this;
    }

    // 游戏开始时的状态
    Game.prototype.start = function() {
        //food被渲染在页面上
        this.food.render(map);
        this.food.render(map);
        //snake被渲染在页面上
        this.snake.render(map);
        //snake自己移动起来
        snakeMove();
        //snake改变移动方向
        keyMove();
    };
    //蛇的通过按键转换方向函数
    function keyMove() {
        document.onkeydown = function(e) {
            // 获取按键的ascllc值
            // console.log(e.keyCode);
            // 根据按键的ascllc值,来改变direction的值
            switch (e.keyCode) {
                case 37:
                    _this.snake.direction = 'left';
                    break;
                case 38:
                    _this.snake.direction = 'top';
                    break;
                case 39:
                    _this.snake.direction = 'right';
                    break;
                case 40:
                    _this.snake.direction = 'bottom';
                    break;
            }
        }
    };
    //蛇移动函数
    function snakeMove() {

        //定义一个定时器
        let timer = setInterval(function() {
            //snake运动起来
            _this.snake.move();
            //先删除自己的原来元素
            _this.snake.remove(_this.map);
            //在重新渲染新元素
            _this.snake.render(_this.map);
            //获取到蛇头位置
            const sHX = _this.snake.body[0].x;
            const sHY = _this.snake.body[0].y;
            const sHeadX = sHX * _this.snake.width;
            const sHeadY = sHY * _this.snake.height;
            // console.log(sHeadX, sHeadY);
            //记录屏幕最大位置的份数
            const maxX = _this.map.clientWidth / _this.snake.width;
            const maxY = _this.map.clientHeight / _this.snake.height;
            // console.log(maxX, maxY);
            //    蛇与食物之间的关系
            for (let i = 0; i < _this.food.element.length; i++) {
                //判断蛇是否吃到食物
                if (sHeadX == _this.food.element[i].offsetLeft && sHeadY == _this.food.element[i].offsetTop) {
                    //吃到食物,食物消失,并重新渲染
                    _this.food.remove(_this.map, i);
                    _this.food.render(_this.map);
                    //蛇的长度要增加(得到原来蛇身snake.body最后一位的下标,是因为新的蛇节将占有上一个蛇节的位置)
                    const snakeLe = _this.snake.body[_this.snake.body.length - 1];
                    _this.snake.body.push({
                        x: snakeLe.x,
                        y: snakeLe.y,
                        color: snakeLe.color
                    });
                    //吃到食物后的分数
                    grade()

                }
            }
            //判断蛇头是否触碰到屏幕
            if (sHX < 0 || sHX >= maxX || sHY < 0 || sHY >= maxY) {
                clearInterval(timer);
                if (confirm(`游戏结束,你的总成绩为${score}。是否重新开始？`)) {
                    location.reload();
                }

            }
        }, 150)
    };
    //获取score的函数
    function grade() {
        score += 1;
        // console.log(score);
        const div = document.getElementById('score');
        div.innerHTML = `<div>总分为:${score}</div>`
    };
    window.Game = Game;
})();